home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-19 / reptext.lsp < prev    next >
Lisp/Scheme  |  1993-05-05  |  8KB  |  229 lines

  1. ;;; REPTEXT.LSP 3.xx is a substantially rewritten version compared to
  2. ;;; version 2.xx.  Please see the * HISTORY * section below.
  3.  
  4. ;;; REPTEXT.LSP is an AutoCAD Release 12 utility to search & replace
  5. ;;; text items in a drawing, including within block definitions,
  6. ;;; dimensions, and attributes.  It will also process these entities in
  7. ;;; nested blocks to any depth.
  8.  
  9. ;;; This routine can be used to search for all or selected instances of
  10. ;;; a particular text string, and replace them with a different string.
  11. ;;; This is most useful for global replacement of references, phrases,
  12. ;;; and control codes.  As an example, this routine could be used to
  13. ;;; replace the old Release 10-style %%127, 128 and 129 control codes,
  14. ;;; with the later %%d, %%p and %%c codes respectively.
  15.  
  16. ;;;                            * USAGE *
  17.  
  18. ;;; After loading the routine (eg. (load "reptext")) and executing by
  19. ;;; typing REPTEXT at the Command: prompt, there are only five or six
  20. ;;; prompts to respond to.  First you will be asked to specify the text
  21. ;;; string to search for, and the string to replace it with.  Both can
  22. ;;; contain spaces.  The search string is not case sensitive.
  23.  
  24. ;;; You are then asked what entity types you wish to process.  These can
  25. ;;; be normal text, dimension user-supplied text, blocks (containing any of
  26. ;;; the other entity types, including nested blocks), and block attribute
  27. ;;; values.  If you respond with Y or Yes to any of these, any relevant
  28. ;;; selected entities will be processed.  Responding Y or Yes to blocks
  29. ;;; will also ask if attribute values are to be processed.  A negative
  30. ;;; answer to all entity types will repeat the prompt sequence.
  31.  
  32. ;;; Lastly, you are asked to select the entities to modify.  You can do
  33. ;;; this with any of the normal AutoCAD entity selection methods (including
  34. ;;; ALL, to process the entire drawing).  REPTEXT will filter out the
  35. ;;; required entities.
  36.  
  37. ;;; The routine will then start processing - you will see text entities
  38. ;;; being dynamically altered on screen.  Block definitions will be
  39. ;;; regenerated on screen after processing is complete.  Have fun!
  40.  
  41. ;;;                                       Peter J T Heald, Autodesk UK Ltd.
  42. ;;;                                       Tech are the biz.
  43.  
  44. ;;;                           * HISTORY *
  45.  
  46. ;;; The main changes between version 2.xx and this version are as follows:
  47.  
  48. ;;;     Associative dimensions will not loose their updated text values
  49. ;;;       during stretching and moving.
  50. ;;;     Block attribute values will now be processed.
  51. ;;;     Dimensions, text, blocks & attributes within blocks will now be
  52. ;;;       processed no matter what the level of nesting.
  53.  
  54. ;;; The main reason for rewriting was because version 2.xx was pretty naf.
  55. ;;; Notation will be added to the code at some stage, when I have time...
  56. ;;; Any comments or suggestions relating to this routine are most welcome.
  57.  
  58. ;;; THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED
  59. ;;; WARRANTY.  ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR
  60. ;;; PURPOSE AND OF MERCHANTABILITY ARE HEREBY DISCLAIMED.
  61.  
  62. (prompt " REPTEXT.LSP by P.Heald Sept'92-Apr'93 Ver. 3.01\n")
  63.  
  64. ;;; Global variables are: blist oldtxt newtxt txttoo dimtoo blktoo atttoo
  65.  
  66. (defun  c:reptext ( / sslist ss count en bllen bdata nen)
  67. (setvar "cmdecho" 0)
  68. (setq   oldtxt  (getstring T "\nText to search for: ")
  69.         newtxt  (getstring T "\nReplace with: ")
  70.         txttoo  F
  71.         dimtoo  F
  72.         blktoo  F
  73. )
  74. (while  (not (or txttoo dimtoo blktoo))
  75.     (prompt "\nSelect desired operation.")
  76.     (initget "Yes No")
  77.     (setq   txttoo (getkword "\nProcess normal text? <Y> : ")
  78.             sslist  '((-4 . "<OR"))
  79.     )
  80.     (if     (= txttoo "No")
  81.             (setq   txttoo  F)
  82.             (setq   sslist  (append sslist '((0 . "TEXT")))
  83.                     txttoo  T
  84.             )
  85.     )
  86.     (initget "Yes No")
  87.     (setq   dimtoo  (getkword "\nProcess dimensions? <N> : "))
  88.     (if     (= dimtoo "Yes")
  89.             (setq   sslist  (append sslist '((0 . "DIMENSION"))))
  90.             (setq   dimtoo  F)
  91.     )
  92.     (initget "Yes No")
  93.     (setq   blktoo  (getkword "\nProcess blocks? <N> : "))
  94.     (if     (= blktoo "Yes")
  95.             (progn  (initget "Yes No")
  96.                     (setq   sslist  (append sslist '((0 . "INSERT")))
  97.                        atttoo  (getkword "\nProcess attributes? <N> : ")
  98.                     )
  99.             )
  100.             (setq  blktoo  F)
  101.     )
  102.     (if     (/= atttoo "Yes") (setq atttoo F))
  103. )
  104. (setq   sslist  (append sslist '((-4 . "OR>")))
  105.         ss      (ssget  sslist)
  106.         count   0
  107.         blist   (list)
  108. )
  109. (prompt "\nProcessing:-\n")
  110. (repeat (sslength ss)
  111.         (setq   en      (ssname ss count)
  112.                  count   (1+ count)
  113.         )
  114.         (entscan en oldtxt newtxt)
  115.         (prompt (strcat "\r" (itoa count) " done."))
  116. )
  117. (prompt "\rDone      ")
  118. (setq   count   0
  119.         bllen   (length blist)
  120. )
  121. (if     (> bllen 0) (prompt "\nProcessing blocks:-\n"))
  122. (while  (and (> bllen 0) (setq   bname   (nth count blist)))
  123.         (setq   count   (1+ count)
  124.                 bdata   (tblsearch "BLOCK" bname)
  125.                 nen     (cdr (assoc -2 bdata))
  126.         )
  127.         (while  (and  nen
  128.                       (/= (cdr (assoc 0 (entget nen))) "ENDBLK")
  129.                 )
  130.                 (entscan nen oldtxt newtxt)
  131.                 (setq   nen     (entnext nen))
  132.         )
  133.         (prompt (strcat "\r" (itoa count) " done."))
  134. )
  135. (prompt "\rDone      ")
  136. (if     (or dimtoo blktoo)
  137.         (progn  (prompt "\nRegenerating drawing.")
  138.                 (command ".regen")
  139.         )
  140. )
  141. (princ)
  142. )
  143.  
  144. (defun  entscan (en oldtxt newtxt / ed et 2f tmp)
  145. (setq   ed      (entget en)
  146.         et      (cdr (assoc 0 ed))
  147.         2f      (cdr (assoc 2 ed))
  148. )
  149. (cond   ((and (= et "TEXT") txttoo) (swaptext en oldtxt newtxt))
  150.         ((and (= et "DIMENSION") dimtoo)
  151.                 (progn (swaptext en oldtxt newtxt)
  152.                        (if      (setq tmp (chklist blist 2f))
  153.                                 (setq blist tmp)
  154.                        )
  155.                 )
  156.         )
  157.         ((and (= et "INSERT") blktoo)
  158.                 (progn  (if     (setq tmp (chklist blist 2f))
  159.                                 (setq blist tmp)
  160.                         )
  161.                         (if     (and atttoo (cdr (assoc 66 ed)))
  162.                                 (attscan en oldtxt newtxt)
  163.                         )
  164.                 )
  165.         )
  166. )
  167. )
  168.  
  169. (defun attscan (ename otxt ntxt / edata parent etype)
  170. (setq   edata   (entget ename)
  171.         parent  edata
  172.         etype   "INSERT"
  173. )
  174. (while  (and ename (/= etype "SEQEND"))
  175.         (setq   ename (entnext ename))
  176.         (if     ename   (setq   edata   (entget ename)
  177.                                 etype   (cdr (assoc 0 edata))
  178.                         )
  179.         )
  180.         (if (= etype "ATTRIB")  (swaptext ename otxt ntxt))
  181. )
  182. (entmod parent)
  183. )
  184.  
  185.  
  186. (defun  swaptext (ename otxt ntxt / edata oldt newt edata)
  187. (setq   edata   (entget ename)
  188.         oldt    (assoc 1 edata)
  189. )
  190. (if     oldt
  191.         (progn  (setq   newt    (cons 1 (swapstr (cdr oldt) otxt ntxt))
  192.                         edata   (subst newt oldt edata)
  193.                 )
  194.                 (entmod edata)
  195.         )
  196. )
  197. )
  198.  
  199. (defun  swapstr (line oldstr newstr / charpos oldlen)
  200. (setq   oldlen  (strlen  oldstr)
  201.         oldstr  (strcase oldstr)
  202.         charpos 1
  203. )
  204. (repeat (1+ (- (strlen line) oldlen))
  205.         (if     (= (strcase (substr line charpos oldlen)) oldstr)
  206.                 (setq   line    (strcat (substr line 1 (1- charpos))
  207.                                          newstr
  208.                                         (substr line (+ charpos oldlen))
  209.                                 )
  210.                         charpos (+ charpos (strlen newstr))
  211.                 )
  212.         )
  213.         (setq   charpos (1+ charpos))
  214. )
  215. (setq line line)
  216. )
  217.  
  218. (defun  chklist (itemlist itemname)
  219. (if     (member itemname itemlist)
  220.         (setq   itemlist F)
  221.         (setq   itemlist (append itemlist (list itemname)))
  222. )
  223. )
  224.  
  225. (princ)
  226.  
  227. ; - - - - - - - - - - - - - - - - - - - End
  228.  
  229.